<?php

namespace Lambq\Http;

use Yurun\Util\HttpRequest;

class Http
{
    protected $httpRequest;

    protected $response;

    protected $code;
    protected $url;


    public function __construct()
    {
        $this->httpRequest                  = new HttpRequest();
        $this->httpRequest->isVerifyCA      = config('laraHttp.ca'); // 是否验证证书
        $this->httpRequest->followLocation  = config('laraHttp.follow'); // 是否启用重定向
        $this->httpRequest->maxRedirects    = config('laraHttp.max'); // 最大重定向次数
        $this->httpRequest->protocolVersion = config('laraHttp.version'); // Http 协议版本
        $this->url                          = config('laraHttp.url');
    }

    /**
     * 批量设置CURL的Option.
     *
     * @param array $options curl_setopt_array()所需要的第二个参数
     *
     * @return static
     */
    public function options(array $array)
    {
        $this->httpRequest->options($array);
        return $this;
    }

    /**
     * 批量设置请求头.
     *
     * @param array $headers 键值数组
     *
     * @return static
     */
    public function headers(array $array)
    {
        $this->httpRequest->headers($array);

        return $this;
    }

    /**
     * 代理.
     *
     * @param string $server 代理服务器地址
     * @param int    $port   代理服务器端口
     * @param string $type   代理类型，支持：http、socks4、socks4a、socks5
     * @param string $auth   代理认证方式，支持：basic、ntlm。一般默认basic
     *
     * 代理认证
     *
     * @param string $username
     * @param string $password
     *
     * @return static
     */
    public function proxy($server, $port, $type = 'http', $auth = 'basic', $username, $password)
    {
        $this->httpRequest->proxy($server, $port, $type, $auth)->proxyAuth($username, $password);

        return $this;
    }

    /**
     * 设置失败重试次数，状态码为5XX或者0才需要重试.
     *
     * @param int           $retry
     * @param callable|null $callback
     *
     * @return static
     */
    public function retry($string)
    {
        $this->httpRequest->retry($string); // 失败重试 3 次
        return $this;
    }

    /**
     * 设置超时时间.
     *
     * @param int $timeout        总超时时间，单位：毫秒
     * @param int $connectTimeout 连接超时时间，单位：毫秒
     *
     * @return static
     */
    public function timeout($timeout = 5, $connectTimeout = 3)
    {
        $this->httpRequest->timeout($timeout, $connectTimeout); // 超时时间设为 30 秒
        return $this;
    }

    /**
     * 发送请求，所有请求的老祖宗.
     *
     * @param string|null         $url         请求地址，如果为null则取url属性值
     * @param string|object|array $requestBody 发送内容，可以是字符串、数组，如果为空则取content属性值
     * @param string              $method      请求方法，GET、POST等
     * @param string|null         $contentType 内容类型，支持null/json，为null时不处理
     *
     * @return \Yurun\Util\YurunHttp\Http\Response|null
     */
    public function send($url = null, $requestBody = null, $method = null, $contentType = null)
    {
        $url            = $this->url.$url;
        $this->response = $this->httpRequest->send($url, $requestBody, $method, $contentType);
        $this->code     = $this->response->getStatusCode();
        return $this;
    }
}
